<?php

class formatter extends singleton
{
	// php singleton wrapper
	static public function &__getMe( ) { return parent::__getMe( __CLASS__ ); }
	static public function &instance() { return parent::__getMe(__CLASS__); }
	
	protected function __construct( )
	{
		
	}
	
	protected $__month = array(
		'en2ru' => array(
			'January' => 'Январь',
			'February' => 'Февраль',
			'March' => 'Март',
			'April' => 'Апрель',
			'May' => 'Май',
			'June' => 'Июнь',
			'July' => 'Июль',
			'August' => 'Август',
			'September' => 'Сентябрь',
			'October' => 'Октябрь',
			'November' => 'Ноябрь',
			'December' => 'Декабрь',
		),
		'ru2' => array(
			'Январь' => 'января',
			'Февраль' => 'февраля',
			'Март' => 'марта',
			'Апрель' => 'апреля',
			'Май' => 'мая',
			'Июнь' => 'июня',
			'Июль' => 'июля',
			'Август' => 'августа',
			'Сентябрь' => 'сентября',
			'Октябрь' => 'октября',
			'Ноябрь' => 'ноября',
			'Декабрь' => 'декабря',
		),
		);
	
	public function __call( $m, $p )
	{
		switch( $m )
		{
		case 'date':
		case 'datetime':
			if( is_int( $p[0] ) || ctype_digit( (string)($p[0]) ) )
				$p[0] = date( 'Y-m-dTH:i:s', $p[0] );
			
			if( isset( $p[1] ) )
			{
				if($p[1] == 'd')
					$p[1] = 'd F Y';
				elseif($p[1] == 'dt')
					$p[1] = 'd F Y, H:i';
				elseif($p[1] == 'db')
					$p[1] = 'Y-m-d H:i:s';
			}
			else
				$p[1] = 'd.m.Y, H:i';
			
			$dt = date_create( $p[0] );
			$r = date_format( $dt, $p[1] );
			return $this ->__replace( $this ->__month['ru2'], $this ->__replace( $this ->__month['en2ru'], $r ) );
			break;
		case 'month':
			$dt = date_create( '01.'.str_pad($p[0],2,'0',STR_PAD_LEFT).'.2010' );
			$r = date_format( $dt, $p[1] );
			return $this ->__replace( $this ->__month['ru2'], $this ->__replace( $this ->__month['en2ru'], $r ) );
			break;
		case 'phone':
			return $this ->cleanupPhone( $p[0], @$p[1] );
			break;
		case 'url':
			return $this ->cleanupUrl( $p[0] );
			break;
		}
		
		return $p[0];
	}
	
	public function __replace( $kv, $s )
	{
		return str_replace( array_keys( $kv ), array_values( $kv ), $s );
	}
	
	protected function findPhone( $phone )
	{
		$phone = preg_replace( '@[^0-9]*@', '', $phone );
		for( $i = strlen($phone); $i>0; $i-- )
		{
			$prefix = substr( $phone, 0, $i );
			if( isset( $list[$prefix] ) )
				return $prefix;
		}
		return null;
	}
	
	public function cleanupPhone( $code, $number = null )
	{
		$phone = $code.$number;
		$r = locale_phones::instance( ) ->format( $phone );
		return $r;
	}
	
	public function cleanupUrl( $url )
	{
		$url = trim( $url );
		// preg_match( '/^(http|ftp)/', $url, $m );
		preg_match( '/^([a-z]{3,6})?:\/\//i', $url, $m );
		$scheme = isset( $m[1] ) ? $m[1] : 'http';
		$url = preg_replace( '/^([a-z]{3,6})?:\/\//i', '', $url );
		
		$url = $scheme.'://'.$url;
		$url = parse_url( $url );
		
		if( !isset( $url['port'] ) )
			$url['port'] = 80;
		if( !isset( $url['path'] ) || !mb_strlen( $url['path'] ) )
			$url['path'] = '/';
		
		$r = sprintf( '%s://%s%s', $url['scheme'], $url['host'].($url['port']&&$url['port']!=80?':'.$url['port']:''), $url['path'] );
		if( isset( $url['query'] ) && $url['query'] )
			$r .= '?'.$url['query'];
		if( isset( $url['fragment'] ) && $url['fragment'] )
			$r .= '#'.$url['fragment'];
		
		//var_dump( $r, $url, $scheme );
		//die;
		return $r;
	}
	
}


/*
if( is_null( $format ) || $format == 'diff' || $format == 'diffp' || $format == 'inaccuracyDiff' )
	{
		if( is_null( $format ) ) $format = 'inaccuracyDiff';
		
		$diff = time()-$timestamp;
		switch( $format )
		{
		case 'inaccuracyDiff':
		$diffclass =
			    $diff < 1*60*60	? 0
			: ( $diff < 6*60*60	? 1
			: ( $diff < 18*60*60	? 2
			: ( $diff < 40*60*60	? 3
			: ( $diff < 7*24*60*60	? 4
			: ( $diff < 11*24*60*60	? 5
			: ( $diff < 19*24*60*60	? 6
			: ( $diff < 30*24*60*60	? 7
//			: ( $diff < 50*24*60*60	? 8
			: null ))))))); //);
		$diffstring = array(
			0 => "только что",	// less than hour
			1 => "недавно",		// 1-6 hours
			2 => "сегодня",		// 6-18 hours
			3 => "вчера",		// 18-40 hours
			4 => "недавно",		// 40-168 hours (~2-7 days)
			5 => "неделю назад",	// 7-11 days
			6 => "полмесяца назад",	// 11-19 days
			7 => "месяц назад",	// 19-30 days
			8 => "пару месяцев назад", // 30-50 days
			);
		
		if( !is_null( $diffclass ) && isset( $diffstring[ $diffclass ] ) )
			return $diffstring[ $diffclass ];
		
		break;
		case 'diff':
		case 'diffp':
		$diffclass =
			    $diff < 1*60	? 0 // less than minute
			: ( $diff < 90*60	? 1 // 1-90 minutes 
			: ( $diff < 40*3600	? 2 // 1.5-40 hours
			: ( $diff < 15*86400	? 3 // 40 hours-15 days (~2-14 days)
			: ( $diff < 62*86400	? 4 // 15-62 days (~2-9 weeks)
			: ( $diff < 36*7*86400	? 5 // 9-36 weeks (2-9 months)
//			: ( $diff < 50*60*60	? 8
			: null )))));
		
		if( is_null( $diffclass ) )
			break;
		if( $diffclass === 0 )
			return 'только что';
		
		$divider = array( 1, 60, 3600, 86400, 604800, 2592000 );
		$text = array(
			1 => ( $format == 'diff' ) ? "минута минуты минут" : "минуту минуты минут", // ж.р.
			2 => "час часа часов",
			3 => "день дня дней",
			4 => ( $format == 'diff' ) ? "неделя недели недель" : "неделю недели недель", // ж.р.
			5 => "месяц месяца месяцев",
			);
		$text1 = array( '', 'на прошлой минуте', 'в прошлом часу', 'вчера', 'на той неделе', 'в прошлом месяце' );
		
		$value = round( $diff / $divider[$diffclass] );
		
		if( $value == 1 ) return $text1[$diffclass];
		return sprintf( '%d %s', $value, _::plural( explode( ' ', $text[$diffclass] ), $value ) ).' назад';
		
		}
		
		$format = trim( ($__noday?'%B':'%e %B').(date('Y',$timestamp)!==date('Y')?($__noday?'\'%y':' %Y'):'') );
	*/